// 泛型
// 只能返回string类型的数据

// 同时返回string类型和number类型（代码冗余）
function getData1(value: string): string {
  return value
}
function getDate2(value: number): number {
  return value
}

// 同时返回string类型和number类型 --- any
// 缺点：放弃了类型检查
// 传入的参数类型和返回的参数类型可以不一致
function getDate(value: any): any {
  return '哈哈哈'
}
getDate(1223)

// 泛型：可以支持不特定的类型
  // 要求：传入的参数和返回的参数一致
function getDateF<T>(value: T): T {
// function getDateF<T>(value: T): any {
  return value
}
getDateF<number>(123)
getDateF<string>(' ')


// 泛型类
  // 有个最小堆算法，需要同时支持返回数字和字符串两种类。
  // 通过类的泛型来实现
class MinClass<T> {
  public list: T[] = []
  add(num: T): void {
    this.list.push(num)
  }
  min(): T {
    var minNum = this.list[0]
    for(var i=0; i<this.list.length; i++) {
      if(minNum > this.list[i]) {
        minNum = this.list[i]
      }
    }
    return minNum
  }
}
// var m = new MinClass()
// 实例化类，并且制定了类的T代表的类型是number
var m = new MinClass<number>()
m.add(3)
m.add(22)
m.add(-1)
console.log(m.min())  //-1
// 实例化类，并制定了类的T代表类型是string
var m2 = new MinClass<string>()
m2.add('c')
m2.add('a')
m2.add('d')
console.log(m2.min())  //a

export {}